package tmplter

import (
	"testing"
)

func Test_ReadCollection(t *testing.T) {
	equals := func(e, a interface{}) {
		if e != a {
			t.Error(e, "!=", a)
		}
	}
	s := `DicName,DicCaption
Dic1,Словарь 1
Dic2,Словарь 2
Dic3,Словарь 3
`
	clc, _ := ReadCollection(s, ',')
	equals(3, len(clc))
	row0 := clc[0]
	equals("Dic1", row0["DicName"])
	equals("Словарь 1", row0["DicCaption"])
	row1 := clc[1]
	equals("Dic2", row1["DicName"])
	equals("Словарь 2", row1["DicCaption"])
	row2 := clc[2]
	equals("Dic3", row2["DicName"])
	equals("Словарь 3", row2["DicCaption"])
}
func Benchmark_ReadCollection(b *testing.B) {
	s := `DicName,DicCaption
Dic1,Словарь 1
Dic2,Словарь 2
Dic3,Словарь 3
`
	for i := 0; i < b.N; i++ {
		_, err := ReadCollection(s, ',')
		if err != nil {
			panic(err)
		}
	}
}

func Test_ParseTemplate(t *testing.T) {
	tpl := `Заголовок {{book.txt/}}{{book}}{{/book.txt}}{{dics.txt/}}
Словарь: "{{DicCaption}}"{{dicitems.txt/}}
  Элемент: "{{ItemCaption}}";{{/dicitems.txt}}{{/dics.txt}}
Все элементы:{{dicitems.txt/}}
  {{ItemCaption}}{{/dicitems.txt}}
Подвал`
	clcs := map[string][]map[string]string{
		"dicitems.txt": {
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item1", "ItemCaption": "Элемент 1"},
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item2", "ItemCaption": "Элемент 2"},
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item3", "ItemCaption": "Элемент 3"},
			map[string]string{"DicName": "Dic2",
				"ItemName": "Item4", "ItemCaption": "Элемент 4"},
			map[string]string{"DicName": "Dic3",
				"ItemName": "Item5", "ItemCaption": "Элемент 5"},
			map[string]string{"DicName": "Dic3",
				"ItemName": "Item6", "ItemCaption": "Элемент 6"},
		},
		"book.txt": {
			map[string]string{"book": "Книга 1"},
		},
		"dics.txt": {
			map[string]string{"DicName": "Dic1", "DicCaption": "Словарь 1"},
			map[string]string{"DicName": "Dic2", "DicCaption": "Словарь 2"},
			map[string]string{"DicName": "Dic3", "DicCaption": "Словарь 3"},
		},
	}
	expected := `Заголовок Книга 1
Словарь: "Словарь 1"
  Элемент: "Элемент 1";
  Элемент: "Элемент 2";
  Элемент: "Элемент 3";
Словарь: "Словарь 2"
  Элемент: "Элемент 4";
Словарь: "Словарь 3"
  Элемент: "Элемент 5";
  Элемент: "Элемент 6";
Все элементы:
  Элемент 1
  Элемент 2
  Элемент 3
  Элемент 4
  Элемент 5
  Элемент 6
Подвал`
	actual, err := ParseTemplate(tpl, clcs, map[string]string{})
	if expected != actual {
		t.Errorf("\n\nEXPECTED: \n%s\n\nACTUAL: \n%s\n\n", expected, actual)
	}
	if err != nil {
		t.Error("err is", err.Error())
	}

	tpl = `...{{collection/}}...{{/collection}}...`
	_, err = ParseTemplate(tpl, clcs, map[string]string{})
	if err.Error() != "? collection" {
		t.Error("err is", err.Error())
	}
}
func Benchmark_ParseTemplate(b *testing.B) {
	tpl := `Заголовок {{book.txt/}}{{book}}{{/book.txt}}{{dics.txt/}}
Словарь: "{{DicCaption}}"{{dicitems.txt/}}
  Элемент: "{{ItemCaption}}";{{/dicitems.txt}}{{/dics.txt}}
Все элементы:{{dicitems.txt/}}
  {{ItemCaption}}{{/dicitems.txt}}
Подвал`
	clcs := map[string][]map[string]string{
		"dicitems.txt": {
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item1", "ItemCaption": "Элемент 1"},
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item2", "ItemCaption": "Элемент 2"},
			map[string]string{"DicName": "Dic1",
				"ItemName": "Item3", "ItemCaption": "Элемент 3"},
			map[string]string{"DicName": "Dic2",
				"ItemName": "Item4", "ItemCaption": "Элемент 4"},
			map[string]string{"DicName": "Dic3",
				"ItemName": "Item5", "ItemCaption": "Элемент 5"},
			map[string]string{"DicName": "Dic3",
				"ItemName": "Item6", "ItemCaption": "Элемент 6"},
		},
		"book.txt": {
			map[string]string{"book": "Книга 1"},
		},
		"dics.txt": {
			map[string]string{"DicName": "Dic1", "DicCaption": "Словарь 1"},
			map[string]string{"DicName": "Dic2", "DicCaption": "Словарь 2"},
			map[string]string{"DicName": "Dic3", "DicCaption": "Словарь 3"},
		},
	}
	for i := 0; i < b.N; i++ {
		_, err := ParseTemplate(tpl, clcs, map[string]string{})
		if err != nil {
			panic(err)
		}
	}
}

func Test_FindPattern(t *testing.T) {

	tpl := "...{{Collection.csv/}}...{{Value}}...{{/Collection.csv}}..."
	ok, name, pattern, content, err := findPattern(tpl)
	if ok != true {
		t.Error("ok is", ok)
	}
	if name != "Collection.csv" {
		t.Error("name is", name)
	}
	if pattern != "{{Collection.csv/}}...{{Value}}...{{/Collection.csv}}" {
		t.Error("pattern is", pattern)
	}
	if content != "...{{Value}}..." {
		t.Error("content is", content)
	}
	if err != nil {
		t.Error("err is", err.Error())
	}

	tpl = "...{{Value}}..."
	ok, _, _, _, _ = findPattern(tpl)
	if ok != false {
		t.Error("ok is", ok)
	}

	tpl = "...{{Collection.csv/}}..."
	ok, _, _, _, err = findPattern(tpl)
	if ok != false {
		t.Error("ok is", ok)
	}
	if err.Error() != "? {{/Collection.csv}}" {
		t.Error("err is", err.Error())
	}

}
func Benchmark_FindPattern(b *testing.B) {
	tpl := "...{{Collection.csv/}}...{{Value}}...{{/Collection.csv}}..."
	for i := 0; i < b.N; i++ {
		_, _, _, _, err := findPattern(tpl)
		if err != nil {
			panic(err)
		}
	}
}
